import Taro from "@tarojs/taro";

/**
 * 页面导航工具类
 */
const router = {
  /**
   * 保留当前页面，跳转到应用内的某个页面
   * @param {string} url 需要跳转的应用内非 tabBar 的页面的路径
   * @param {object} params 页面参数
   * @returns {Promise}
   */
  navigateTo(url) {
    return Taro.navigateTo(url);
  },

  /**
   * 关闭当前页面，跳转到应用内的某个页面
   * @param {string} url 需要跳转的应用内非 tabBar 的页面的路径
   * @param {object} params 页面参数
   * @returns {Promise}
   */
  redirectTo(url) {
    return Taro.redirectTo(url);
  },

  /**
   * 关闭所有页面，打开到应用内的某个页面
   * @param {string} url 需要跳转的应用内非 tabBar 的页面的路径
   * @param {object} params 页面参数
   * @returns {Promise}
   */
  reLaunch(url) {
    return Taro.reLaunch(url);
  },

  /**
   * 跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面
   * @param {string} url 需要跳转的 tabBar 页面的路径
   * @param {object} params 页面参数
   * @returns {Promise}
   */
  switchTab(url, params = {}) {
    const queryString = this._buildQueryString(params);
    return Taro.switchTab({
      url: this._buildUrl(url, queryString),
    });
  },

  /**
   * 返回上一页面或多级页面
   * @param {number} delta 返回的页面数，如果 delta 大于现有页面数，则返回到首页
   * @returns {Promise}
   */
  navigateBack(delta = 1) {
    return Taro.navigateBack({
      delta,
    });
  },

  /**
   * 构建带参数的URL
   * @private
   * @param {string} url 基础URL
   * @param {string} queryString 查询字符串
   * @returns {string}
   */
  _buildUrl(url, queryString) {
    if (!queryString) return url;
    return `${url}${url.includes("?") ? "&" : "?"}${queryString}`;
  },

  /**
   * 构建查询字符串
   * @private
   * @param {object} params 参数对象
   * @returns {string}
   */
  _buildQueryString(params) {
    if (!params || Object.keys(params).length === 0) return "";
    return Object.entries(params)
      .map(
        ([key, value]) =>
          `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
      )
      .join("&");
  },
};

export default router;
